package cn.ike.service.cargo.impl;

import cn.ike.dao.cargo.ContractDao;
import cn.ike.dao.cargo.ContractProductDao;
import cn.ike.dao.cargo.ExtCproductDao;
import cn.ike.domain.cargo.*;
import cn.ike.domain.vo.ContractProductVo;
import cn.ike.service.cargo.ContractProductService;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.UUID;

@Service(timeout = 200000)
public class ContractProductServiceImpl implements ContractProductService {

    // 货物
    @Autowired
    private ContractProductDao contractProductDao;
    // 合同
    @Autowired
    private ContractDao contractDao;
    // 附件
    @Autowired
    private ExtCproductDao extCproductDao;

    /**
     * 分页查询
     * @param contractProductExample 分页查询的参数
     * @param pageNum                当前页
     * @param pageSize               页大小
     * @return
     */
    @Override
    public PageInfo<ContractProduct> findByPage(ContractProductExample contractProductExample, int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<ContractProduct> list = contractProductDao.selectByExample(contractProductExample);
        return new PageInfo<>(list);
    }

    /**
     * 查询所有
     * @param contractProductExample
     */
    @Override
    public List<ContractProduct> findAll(ContractProductExample contractProductExample) {
        return contractProductDao.selectByExample(contractProductExample);
    }

    /**
     * 根据id查询
     * @param id
     */
    @Override
    public ContractProduct findById(String id) {
        return contractProductDao.selectByPrimaryKey(id);
    }

    /**
     * 新增
     * @param contractProduct
     */
    @Override
    public void save(ContractProduct contractProduct) {
        contractProduct.setId(UUID.randomUUID().toString());
        // 货物金额
        Double amount = 0d;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null){
            amount = contractProduct.getCnumber() * contractProduct.getPrice();
        }
        contractProduct.setAmount(amount);

        // 修改购销合同
        // 根据合同id查询合同
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        // 修改合同总金额
        contract.setTotalAmount(contract.getTotalAmount() + amount);
        // 修改合同数量
        contract.setProNum(contract.getProNum() + 1);
        // 修改合同
        contractDao.updateByPrimaryKeySelective(contract);

        // 保存货物
        contractProductDao.insertSelective(contractProduct);
    }

    /**
     * 修改
     * @param contractProduct
     */
    @Override
    public void update(ContractProduct contractProduct) {
        // 货物金额
        Double newAmount = 0d;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null){
            newAmount = contractProduct.getCnumber() * contractProduct.getPrice();
        }
        contractProduct.setAmount(newAmount);

        // 获取修改前的货物总金额
        ContractProduct product = contractProductDao.selectByPrimaryKey(contractProduct.getId());
        Double oldAmount = product.getAmount();

        // 修改购销合同
        // 查询购销合同
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        // 修改合同总金额 = 合同总金额 + 修改后的货物总金额 - 修改前的货物总金额
        contract.setTotalAmount(contract.getTotalAmount() + newAmount - oldAmount);
        // 修改合同
        contractDao.updateByPrimaryKeySelective(contract);
        contractProductDao.updateByPrimaryKeySelective(contractProduct);
    }

    /**
     * 删除
     * @param id
     */
    @Override
    public void delete(String id) {
        // A. 根据货物id，查询货物
        ContractProduct contractProduct = contractProductDao.selectByPrimaryKey(id);
        // B. 根据货物id，查询附件，累加附件金额、附件数量，
        ExtCproductExample extCproductExample = new ExtCproductExample();
        // 根据货物id查询附件
        extCproductExample.createCriteria().andContractProductIdEqualTo(id);
        List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);
        // 累加附件金额
        Double extAmount = 0d;
        for (ExtCproduct extCproduct : extCproductList) {
            // 金额
            extAmount += extCproduct.getAmount();
            // 删除附件
            extCproductDao.deleteByPrimaryKey(extCproduct.getId());
        }
        // C. 修改购销合同
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        //         总金额 = 总金额 - 货物金额 - 附件金额
        contract.setTotalAmount(contract.getTotalAmount() - contractProduct.getAmount() - extAmount);
        // 货物数量 = 货物数量 - 1
        contractProduct.setCnumber(contractProduct.getCnumber() - 1);
        // 附件数量 = 附件数量 - 当前删除的货物中附件数量
        contract.setExtNum(contract.getExtNum() - extCproductList.size());
        contractDao.updateByPrimaryKeySelective(contract);
        // D. 删除： 货物、附件
        contractProductDao.deleteByPrimaryKey(id);
    }

    /**
     * 出货表导出查询
     * @param shipTime
     */
    @Override
    public List<ContractProductVo> findByShipTime(String shipTime) {
        return contractProductDao.findByShipTime(shipTime);
    }
}
